/*
 * Copyright (c) 2014. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
 * http://www.apache.org/licenses/LICENSE-2.0
 */

package com.dc.gameserver.serverCore.controller.AbstractController;


import com.dc.gameserver.serverCore.service.character.PlayerInstance;
import com.google.protobuf.MessageLite;
import io.netty.buffer.ByteBuf;

import java.io.Serializable;

/**
 * @author :陈磊 <br/>
 * Date: 12-12-14<br/>
 * Time: 下午2:36<br/>
 * connectMethod:13638363871@163.com<br/>
 * buf封装 数据包操作类
 * 数据分发处理接口  以及处理buffer数据
 *
 * 数据包协议类型：1.包长+包类型+包体（消息部分）
 *                  1）包体：length+msg+length+msg ... ...
 *                  注意：操作ChannelBuffer的getxx()方式，method does not modify readerIndex
 *                  readXXX(),writeXX(),将会改变读写指针
 */
public interface IController extends Serializable {

    /****使用数组来存储数据包和处理函数的关系，通过数组下标索引来找到相应的操作处理函数的引用**/
    static final IController[] GAME_CONTROLLERS=new IController[9999];//游戏数据包
    /**服务器初始化的时候加载MessageLite[]***/
    static final MessageLite MESSAGE_LITE[]=new MessageLite[9999];
    /**
     * 数据包分发
     * @param buffer   数据载体
     * @param player     active object
     * 当前游戏服务器中buffer在此函数中释放
     */
    void DispatchByteBuffer(final ByteBuf buffer, final PlayerInstance player) throws Exception;

    /**
     * messageLite数据结构体分发
     * @param messageLite     数据载体
     * @param player active object
     * @throws Exception
     * 注意messageLite应该递交给GC直接处理  ，set null
     */
    void DispatchMessageLit(final MessageLite messageLite, final PlayerInstance player) throws Exception;

    /**
     * release byteBuffer
     * @param byteBuf
     */
     void releaseBuf(ByteBuf byteBuf);

    /**
     *  创建ByteBuffer  heapBuffer
     * @return    PoolByteBuffer
     */
    ByteBuf creatPoolByteBuffer();

    /**
     *  创建ByteBuffer  heapBuffer
     * @param capacity 指定大小
     * @return    PoolByteBuffer
     */
    ByteBuf creatPoolByteBuffer(int capacity);

    /**
     * 创建直接缓冲byteBuffer
     * @return
     */
    ByteBuf creatPoolDircetlyByteBuffer();

    /**
     * 创建指定大小的直接缓冲区byteBuffer
     * @param capacity
     * @return
     */
    ByteBuf creatPoolDircetlyByteBuffer(int capacity);
    /**
     * 创建ByteBuffer  heapBuffer
     * @return ByteBuf
     */
    ByteBuf creatUnpoolByteBuffer();

    /**
     * 创建ByteBuffer  heapBuffer
     * @param capacity 指定大小
     * @return ByteBuf
     */
    ByteBuf creatUnpoolByteBuffer(int capacity);

    /**
     * 创建buf  默认是heap buf
     * @param byteBuf
     * @return
     */
    ByteBuf creatByteBuffer(ByteBuf byteBuf);

    /**
     * 创建buf   默认是heap buf
     * @param byteBuf
     * @param capacity   创建buffer大小
     * @return
     */
    ByteBuf creatByteBuffer(ByteBuf byteBuf,int capacity);

    /**
     * 释放资源
     * @param buf
     */
    void release(ByteBuf buf);

    /**
     * read a byte (1 code)
     * @param buffer buffer
     * @return byte
     */
    byte readByte(ByteBuf buffer);
    /**
     *  read a short (2 code)
     * @param buffer  buffer
     * @return short
     */
    short readShort(ByteBuf buffer);
    /**
     *  read a short (4 code)
     * @param buffer  buffer
     * @return int
     */
    int  readInt(ByteBuf buffer);
    /**
     * @param buffer 待处理数据缓存区
     * @return message
     *       如果默认读取1字节(readBytes())长度的字符串，那么该方法传入buffer将直接返回相应的字符串
     *       编码格式:utf-8
     */
    String readStringUTF8(ByteBuf buffer);
    /**
     *
     * @param buffer  待处理数据缓存区
     * @param length 读取指定的数据长度  readBytes() ,readShort() or readLong();
     * @return message
     *         编码格式:utf-8
     */
    String readStringUTF8(ByteBuf buffer, int length);
    /**
     *
     * @param buffer   待处理数据缓存区
     * @return  message
     *         如果默认读取1字节长度的字符串，那么该方法传入buffer将直接返回相应的字符串
     *         编码格式:utf-8
     */
    String readString2(ByteBuf buffer);

    /**
     * 将buffer数据转化为String
     * 此函数和readString(ChannelBuffer buffer, int length）功能一样的
     * 数据长，注意要跳过length
     * @param buffer  待处理数据缓存区
     * @param length   数据长度
     * @return  message
     */
    String readString2(ByteBuf buffer, int length);

    /**
     * 以gbk编码解析数据string
     * @param buffer
     * @param length
     * @return
     */
    String readStringGBK(ByteBuf buffer, int length);


    /**
     *  构建数据包 ，处理一级类型数据包
     * 注意：此方法适应的协议是：
     *       paras数据结构-----> length+msg+length+msg ... ...
     *       length: byte(1字节),short（2字节）,int（4字节）
     * @param arg1 类型1  注意 ：args1<0
     * @return  buffer
     */
    ByteBuf getWriteBufferA(int arg1, Object... paras);

    /**
     * 构建数据包 ，处理二级类型数据包
     * @param arg1 类型1
     * @param arg2  类型2
     * @param paras 待发送的数据
     *              paras数据-----> length+msg+length+msg ... ...
     *              length: byte(1字节),short（2字节）,int（4字节）
     * @return buffer
     */
    ByteBuf getWriteBufferB(int arg1, int arg2, Object... paras);

    /**
     * 构架buffer
     * @param arg1
     * @param arg2
     * @param messageLite
     * @return
     */
    ByteBuf wrappedBufferInt(int arg1, int arg2,MessageLite messageLite);

    /**
     * 构架buffer
     * @param arg1
     * @param arg2
     * @param messageLite
     * @return
     */
    ByteBuf wrappedBufferShort(int arg1, int arg2,MessageLite messageLite);


    /**
     *  包长度2字节
     * @param ID  数据包编号
     * @param messageLite
     * @return
     */
    ByteBuf wrappedBufferInt(int ID,MessageLite messageLite);

    /**
     * 包长度2字节
     * @param ID  数据包编号
     * @param messageLite
     * @return
     */
    ByteBuf wrappedBufferShort(int ID,MessageLite messageLite);

    /**
     * 解析buffer数据为json对象
     * @param buffer
     * @param clazz
     * @return
     */
    Object parseObject(ByteBuf buffer, Class clazz);

    /**
     * buffer to array
     * @param buffer
     * @return
     */
    byte[] BufferToByteArray(ByteBuf buffer);
}
